Route Blinding
If you use route blinding in payment, you have to create encrypted_recipient_data for each hops in blinded route. encrypted_recipient_data is a encrypted_data_tlv defined in Route blinding section.
If got encrypted_data, decrypt it and find next node id. Then pass the rest of the packet to the next node.
通常 sender は route 上のすべての node id を知る。各 hop の node id を使って暗号化用の鍵を共有する。
sender は自分の公開鍵ではなく、一時的な session key を hop ごとに使う
この session key をすべて payload に含めるのではなく、決定的に導出できる仕組みになっている。hop(i) のための session keyは hop(i-1) の session key, shared secret, node pubkey から導出される
しかし sender に node id を知られないようにするのが route blinding の目的。
receiver が事前に暗号化した hop の情報を使う
hop だけがそれを復号化できる
通常の sender が作る onion の中に、receiver が作る onion が含まれているイメージだと思う
わかりやすい絵
sender は route 上の node pubkey を暗号化して route を作成する。blinded route に含まれるノードはそれらを decrypt することで自分のがデータを渡すべき次の node pubkey を知る
receiver N(r) がルートを作成する
receive と各hop N(i) だけが知る shared secret(ss) を作成する
H(e(i) * N(i)) = H(k(i) * E(i))
e(i) を receiver が生成する
ss を使って blind された node id を生成する
ss を使って暗号化用の鍵を生成する
receiver は各 hop 向けに暗号化したデータを作成する
使う鍵は上で説明した通りに作成
含めるデータは 次 hop のノード id
hop はどうやって復号化のための鍵を算出するか
定義より ss H(k(i) * E(i)) から導出できる
E(i) を hop に渡す必要がある
E(0) は receive が sender に渡す?
E(i) は E(i+1) = H(E(i) || ss(i)) * E(i) なので ss と E から次の hop のための E を生成できる
通常の onion routing と同じ
LND